package com.size.mall.cart.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.size.mall.config.annotations.LoginRequired;
import com.size.mall.mallapi.entity.OmsCartItem;
import com.size.mall.mallapi.entity.PmsSkuInfo;
import com.size.mall.mallapi.service.CartService;
import com.size.mall.mallapi.service.PmsSkuInfoService;
import com.size.mall.util.CookieUtil;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static cn.hutool.core.util.StrUtil.isBlank;
import static cn.hutool.core.util.StrUtil.isNotBlank;

@Controller
@CrossOrigin
public class CartController {


    @Reference
    PmsSkuInfoService skuService;

    @Reference
    CartService cartService;




    @RequestMapping("checkCart")
    @LoginRequired(/*loginSuccess = false*/)

    public String checkCart(
            String isChecked, String skuId, HttpServletRequest request, HttpServletResponse response,
            HttpSession session, ModelMap modelMap
                           ) {


        String memberId = "1";

        // 调用服务，修改状态
        OmsCartItem omsCartItem = new OmsCartItem();
        omsCartItem.setMemberId(memberId);
        omsCartItem.setProductSkuId(skuId);
        omsCartItem.setIsChecked(isChecked);
        cartService.checkCart(omsCartItem);

        // 将最新的数据从缓存中查出，渲染给内嵌页
        List<OmsCartItem> omsCartItems = cartService.cartList(memberId);
        modelMap.put("cartList", omsCartItems);

        // 被勾选商品的总额
        BigDecimal totalAmount = getTotalAmount(omsCartItems);
        modelMap.put("totalAmount", totalAmount);
        return "cartListInner";
    }


    /**
     * Desc: 计算总价   ||
     * Param: [omsCartItems]    ||
     * Return: java.math.BigDecimal    ||
     */
    private BigDecimal getTotalAmount(List<OmsCartItem> omsCartItems) {

        BigDecimal bigDecimal = omsCartItems.stream()
                                            .filter(check -> check.getIsChecked().equals("1")) // 过滤
                                            .map(item -> item.getTotalPrice())  // 转化
                                            .reduce((x, y) -> x.add(y).setScale(2, BigDecimal.ROUND_HALF_DOWN)).get();
        // 归约

        return bigDecimal;
    }

    @RequestMapping("cartList")
    @LoginRequired(loginSuccess = false)
    public String cartList(
            HttpServletRequest request, HttpServletResponse response, HttpSession session,
            ModelMap modelMap
                          ) {

        List<OmsCartItem> omsCartItems = new ArrayList<>();
        String memberId = (String)request.getAttribute("memberId");
        String nickname = (String)request.getAttribute("nickname");
        if (isNotBlank(memberId)) {
            // 已经登录查询db
            omsCartItems = cartService.cartList(memberId);
        } else {
            // 没有登录查询cookie
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            if (isNotBlank(cartListCookie)) {
                omsCartItems = JSON.parseArray(cartListCookie, OmsCartItem.class);
            }
        }

        for (OmsCartItem omsCartItem : omsCartItems) {
            omsCartItem.setTotalPrice(omsCartItem.getPrice().multiply(omsCartItem.getQuantity()));
        }

        modelMap.put("cartList", omsCartItems);
        // 被勾选商品的总额
        BigDecimal totalAmount = _getTotalAmount(omsCartItems);
        modelMap.put("totalAmount", totalAmount);
        return "cartList";
    }

    /**
     * desc: 计算总价格
     * Param: [omsCartItems]
     * return: java.math.BigDecimal
     */
    private BigDecimal _getTotalAmount(List<OmsCartItem> omsCartItems) {
        BigDecimal totalAmount = new BigDecimal("0");

        if (!omsCartItems.isEmpty()) {
            for (OmsCartItem omsCartItem : omsCartItems) {
                if (null==omsCartItem) continue;
                BigDecimal totalPrice = omsCartItem.getTotalPrice();

                String isChecked = omsCartItem.getIsChecked();
                if (isChecked!=null&& isChecked.equals("1")) {
                    totalAmount = totalAmount.add(totalPrice);
                }
            }
        }


        return totalAmount;
    }


    /**
     * desc: 添加到购物车
     * Param: [skuId, quantity, request, response, session]
     * return: java.lang.String
     */
    @PostMapping("addToCart")
    @LoginRequired(loginSuccess = false)
    public String addToCart(
            String skuId, int quantity, HttpServletRequest request, HttpServletResponse response,
            HttpSession session
                           ) {


        List<OmsCartItem> omsCartItems = new ArrayList<>();

        // 调用商品服务查询商品信息
        PmsSkuInfo skuInfo = (PmsSkuInfo)skuService.getSkuById(skuId, "");
        OmsCartItem omsCartItem = new OmsCartItem();
        omsCartItem.setCreateDate(new Date());
        omsCartItem.setDeleteStatus(0);
        omsCartItem.setModifyDate(new Date());
        omsCartItem.setPrice(skuInfo.getPrice());
        omsCartItem.setProductAttr("");
        omsCartItem.setProductBrand("");
        omsCartItem.setProductCategoryId(skuInfo.getCatalog3Id());
        omsCartItem.setProductId(skuInfo.getProductId());
        omsCartItem.setProductName(skuInfo.getSkuName());
        omsCartItem.setProductPic(skuInfo.getSkuDefaultImg());
        omsCartItem.setProductSkuCode("11111111111");
        omsCartItem.setProductSkuId(skuId);
        omsCartItem.setQuantity(new BigDecimal(quantity));


        // 判断用户是否登录
        String memberId = (String)request.getAttribute("memberId");

        if (isBlank(memberId)) {
            // 用户没有登录

            // cookie里原有的购物车数据
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            if (isBlank(cartListCookie)) {
                // cookie为空
                omsCartItems.add(omsCartItem);
            } else {
                // cookie不为空
                omsCartItems = JSON.parseArray(cartListCookie, OmsCartItem.class);
                // 判断添加的购物车数据在cookie中是否存在
                boolean exist = _if_cart_exist(omsCartItems, omsCartItem);
                if (exist) {
                    // 之前添加过，更新购物车添加数量
                    for (OmsCartItem cartItem : omsCartItems) {
                        if (cartItem.getProductSkuId().equals(omsCartItem.getProductSkuId())) {
                            cartItem.setQuantity(cartItem.getQuantity().add(omsCartItem.getQuantity()));
                        }
                    }
                } else {
                    // 之前没有添加，新增当前的购物车
                    omsCartItems.add(omsCartItem);
                }
            }

            // 更新cookie
            CookieUtil.setCookie(request, response, "cartListCookie", JSON.toJSONString(omsCartItems), 60 * 60 * 72,
                                 true
                                );
        } else {
            // 用户已经登录
            // 从db中查出购物车数据
            OmsCartItem omsCartItemFromDb = cartService.ifCartExistByUser(memberId, skuId);

            if (omsCartItemFromDb == null) {
                // 该用户没有添加过当前商品
                omsCartItem.setMemberId(memberId);
                omsCartItem.setMemberNickname("test小明");
                omsCartItem.setQuantity(new BigDecimal(quantity));
                cartService.addCart(omsCartItem);

            } else {
                // 该用户添加过当前商品
                omsCartItemFromDb.setQuantity(omsCartItemFromDb.getQuantity().add(omsCartItem.getQuantity()));
                cartService.updateCart(omsCartItemFromDb);
            }

            // 同步缓存
            cartService.flushCartCache(memberId);
        }


        return "redirect:/success.html";
    }


    /**
     * desc:  判断购物车时候有值
     * Param: [omsCartItems, omsCartItem]
     * return: boolean
     */
    private boolean _if_cart_exist(List<OmsCartItem> omsCartItems, OmsCartItem omsCartItem) {


        boolean b = false;

        for (OmsCartItem cartItem : omsCartItems) {
            String productSkuId = cartItem.getProductSkuId();

            if (productSkuId.equals(omsCartItem.getProductSkuId())) {
                b = true;
            }
        }


        return b;
    }


}